<?php


class ImageHelper{
    /**
     *   Kiểm tra tệp tin có phải kiểu ảnh hay không
     *   parameters: 
     *       @imagePath: đường dẫn đến tệp ảnh hoặc url
     *   results: true nếu tệp tin tồn tại và kiểu tệp là kiểu ảnh
     */
    public static function CheckImage($imagePath){
	   $url= getimagesize($imagePath);
       if (is_array($url)){
            return true;
       }
       else return false; 	
    }
    
    /**
     *   Thay đổi kích thước ảnh
     *   parameters: 
     *      @imagePath: đường dẫn đến file ảnh hoặc url
     *      @savePath: đường dấn tệp kết quả
     *      @width: chiều rộng ảnh đích
     *      @height: chiều cao ảnh đích
     *      @outputType: định dạng ảnh trả về ''
     *      @keepRatio: dữ lại tỷ lệ
     *   results: true nếu thành công và false nếu tệp không tồn tại hoặc không phải tệp ảnh
    */
    public static function Resize($imagePath, $savePath, $width, $height, $outputType='jpg', $keepRatio= false)
	{
		if(!$keepRatio){
			list($current_width, $current_height) = getimagesize($imagePath );
			$canvas = imagecreatetruecolor($width, $height);
			$current_image = self::GetImage($imagePath);
			imagecopyresampled($canvas, $current_image, 0, 0, 0, 0, $width, $height, $current_width, $current_height);
			self::SaveImage($canvas, $savePath, $outputType);
		}
		else
			self::ResizeKeepRatio($imagePath, $savePath, $width, $height, $outputType);
    } 
    
	/**
     *   Thay đổi kích thước ảnh giữ nguyên tỉ lệ ảnh
     *   parameters: 
     *      @imagePath: đường dẫn đến file ảnh hoặc url
     *      @savePath: đường dấn tệp kết quả
     *      @width: chiều rộng ảnh đích
     *      @height: chiều cao ảnh đích
     *      @outputType: định dạng ảnh trả về
     *   results: true nếu thành công và false nếu tệp không tồn tại hoặc không phải tệp ảnh
    */
    public static function ResizeKeepRatio($imagePath, $savePath, $width, $height, $outputType='jpg') 
    {
        list($current_width,$current_height)=getimagesize($imagePath);
        $ImageSource = self::GetImage($imagePath);
        if ($ImageSource) {
            $Ratio=($current_height/$current_width);
            //$ImageSource=$CreateFunction($imagePath);
            if ($current_width > $width || $current_height > $height) {
                if ($current_width > $width) {
                    $ResizedWidth=$width;
                    $ResizedHeight=$ResizedWidth*$Ratio;
                }
            else {
                $ResizedWidth=$current_width;
                $ResizedHeight=$current_height;
            }       
            if ($ResizedHeight > $height) {
                $ResizedHeight=$height;
                $ResizedWidth=$ResizedHeight/$Ratio;
            }      
            $ResizedImage=imagecreatetruecolor($ResizedWidth,$ResizedHeight);
            imagecopyresampled($ResizedImage,$ImageSource,0,0,0,0,$ResizedWidth,$ResizedHeight,$current_width,$current_height);
            }
            else {
                $ResizedWidth=$current_width;
                $ResizedHeight=$current_height;     
                $ResizedImage=$ImageSource;
            }   
            self::SaveImage($ResizedImage,$savePath,$outputType);
            return true;
        }   
        else
            return false;
}

    
    
    /**
     *   Cắt ảnh
     *   parameters: 
     *       @imagePath: đường dẫn đến file ảnh 
     *       @savePath: đường dấn tệp kết quả
     *       @left: tọa độ x điểm bắt đầu crop
     *       @top:  tọa độ y điểm bắt đầu crop
     *       @width: chiều rộng ảnh đích
     *       @height: chiều cao ảnh đích
     *       @outputType: định dạng ảnh trả về
     *   results: true nếu thành công và false nếu tệp không tồn tại hoặc không phải tệp ảnh
    */
    
    public static function Crop($imagePath, $savePath, $left, $top, $width, $height, $outputType='jpg')
	{
        list($current_width, $current_height) = getimagesize($imagePath);
        $canvas = imagecreatetruecolor($width, $height);
        $current_image = self::GetImage($imagePath);
        imagecopy($canvas, $current_image, 0, 0, $left, $top, $current_width, $current_height);
        self::SaveImage($canvas, $savePath, $outputType);
	}
    
    /**
     *   Thay đổi kích thước và cắt ảnh
     *   parameters: 
     *       @imagePath: đường dẫn đến file ảnh 
     *       @savePath: đường dấn tệp kết quả
     *       @width: chiều rộng ảnh đích
     *       @height: chiều cao ảnh đích
     *       @outputType: định dạng ảnh trả về
     *   results: true nếu thành công và false nếu tệp không tồn tại hoặc không phải tệp ảnh
    */
    
    public static function ResizeAndCrop($imagePath, $savePath, $width, $height, $outputType='jpg') { 
        list($current_width, $current_height) = getimagesize($imagePath);   
        $current_image = self::GetImage($imagePath);
        $current_ratio = $current_width/$current_height;
        if ($width/$height > $current_ratio) {
            $new_height = $width/$current_ratio;
            $new_width = $width;
        } else {
            $new_width = $height*$current_ratio;
            $new_height = $height;
        }
        $x_mid = $new_width/2;  //horizontal middle
        $y_mid = $new_height/2; //vertical middle
     
        $canvas = imagecreatetruecolor(round($new_width), round($new_height)); 
        imagecopyresampled($canvas, $current_image, 0, 0, 0, 0, $new_width, $new_height, $current_width, $current_height);
        $thumb = imagecreatetruecolor($width, $height); 
        imagecopyresampled($thumb, $canvas, 0, 0, ($x_mid-($width/2)), ($y_mid-($height/2)), $width, $height, $width, $height);

        imagedestroy($canvas);
        imagedestroy($current_image);
        self::SaveImage($thumb, $savePath, $outputType);
    }
	
    /**
     *   Xoay ảnh
     *   parameters: 
     *       @imagePath: đường dẫn đến file ảnh 
     *       @savePath: đường dấn tệp kết quả
     *       @degs: góc xoay chỉ chấp nhận các tham số 90, 180, 270
     *       @outputType: định dạng ảnh trả về
     *   results: true nếu thành công và false nếu tệp không tồn tại hoặc không phải tệp ảnh
    */   
    function Rotate($imagePath, $savePath, $degs, $outputType='jpg') {
        $img = self::GetImage($imagePath);
        $width = imagesx($img);
        $height = imagesy($img);
        switch($degs) {
            case 90: $newimg= @imagecreatetruecolor($height , $width );break;
            case 180: $newimg= @imagecreatetruecolor($width , $height );break;
            case 270: $newimg= @imagecreatetruecolor($height , $width );break;
            case 0: return $img;break;
            case 360: return $img;break;
        }
        if($newimg) { 
            for($i = 0;$i < $width ; $i++) { 
                for($j = 0;$j < $height ; $j++) {
                    $reference = imagecolorat($img,$i,$j);
                    switch($degs) {
                        case 90: if(!@imagesetpixel($newimg, ($height - 1) - $j, $i, $reference )){return false;}break;
                        case 180: if(!@imagesetpixel($newimg, $width - $i, ($height - 1) - $j, $reference )){return false;}break;
                        case 270: if(!@imagesetpixel($newimg, $j, $width - $i, $reference )){return false;}break;
                    }
                } 
            }self::SaveImage($newimg, $savePath, $outputType); 
        } 
   
    }
    
    /**
     *  Lật ảnh
     *   parameters: 
     *       @imagePath: đường dẫn đến file ảnh 
     *       @savePath: đường dấn tệp kết quả
     *       @direction: hướng lật ảnh chỉ chấp nhận các tham số 'vertical', 'horizon'
     *       @outputType: định dạng ảnh trả về
     *   results: true nếu thành công và false nếu tệp không tồn tại hoặc không phải tệp ảnh       
     */    
    public static function Flip($imagePath, $savePath, $direction, $outputType='jpg'){
        $img = self::GetImage($imagePath);
        $width = imagesx($img);
        $height = imagesy($img);
        $canvas = imagecreatetruecolor($width, $height);
        if ($direction='vertical') {
            for ($y = 0; $y < $height; $y++) {
                imagecopy($canvas, $img, 0, $y, 0, $height - $y - 1, $width, 1);
            }
        }
        else if ($direction='horizon'){
            for ($x = 0; $x < $width; $x++) {
                imagecopy($canvas, $img, $x, 0, $width - $x - 1, 0, 1, $height);
        }
        }
        self::SaveImage($canvas, $savePath, $outputType);
    
    }
    
    /**
     * Đóng dấu vào ảnh
     *   parameters: 
     *       @imagePath: đường dẫn đến file ảnh 
     *       @savePath: đường dấn tệp kết quả
     *       @waterMark: chữ cần thêm vào ảnh
     *       @outputType: định dạng ảnh trả về
     *   results: true nếu thành công và false nếu tệp không tồn tại hoặc không phải tệp ảnh
     */
    public static function Stamp($imagePath, $savePath, $waterMark, $outputType='jpg')
	{
        list($width, $height) = getimagesize($imagePath);
        $image_p = imagecreatetruecolor($width, $height);
        $image = self::GetImage($imagePath);
        imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width, $height); 
        $black = imagecolorallocate($image_p, 0, 0, 0);
        $font = 'arial.ttf';
        $font_size = 10; 
        imagettftext($image_p, $font_size, 0, 10, 20, $black, $font, $waterMark);
        if ($savePath<>'') {
            self::SaveImage ($image_p, $savePath, $outputType); 
        } else {
            header('Content-Type: image/jpeg');
            self::SaveImage($image_p, null, $outputType);
        };
        imagedestroy($image); 
        imagedestroy($image_p);
    }
	
    /**
     * Hàm tạo ảnh từ file hoặc url
     *   parameters: 
     *       @imagePath: đường dẫn đến file ảnh 
     *   results: hình ảnh hoặc false nếu không hỗ trợ
     */
    private static function GetImage($imagePath){
        if(preg_match("/.jpg/i", "$imagePath"))
        {
           return imagecreatefromjpeg($imagePath);
        } 
		else if (preg_match("/.gif/i", "$imagePath"))
        {
           return imagecreatefromgif($imagePath);
        }else if(preg_match("/.png/i", "$imagePath"))
        {
           return imagecreatefrompng($imagePath);
        }else
            return false;
        
    }
    
    /**
     * Hàm lưu ảnh ra file tùy theo định dạng
     *   parameters: 
     *       @image: ảnh cần lưu
     *       @savePath: đường dấn tệp kết quả
     *       @outputType: định dạng ảnh trả về  
     *   results: hình ảnh hoặc false nếu không hỗ trợ
     */
    private static function SaveImage($image, $savePath, $outputType='jpg')
    {
        switch ($outputType){
            case "jpg": imagejpeg ($image, $savePath, 80); break;
            case "JPG": imagejpeg ($image, $savePath, 80); break;
            case "png": imagepng($image, $savePath, 8); break;
            case "PNG": imagepng($image, $savePath, 8); break;
            case "gif": imagegif($image, $savePath); break;
            case "GIF": imagegif($image, $savePath); break;
        }
          
    }
}

?>